<?php

declare(strict_types=1);

namespace Modules\DataCheck\Models;

use Catch\Base\CatchModel as Model;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Modules\DataCheck\Enums\TaskStateEnum;
use Modules\DataCheck\Models\Casts\UnescapedJsonCast;
use Modules\Permissions\Models\Traits\DataRange;

/**
 * @property int $id 主键ID
 * @property string $task_id 任务id
 * @property string $task_name 数据核对任务名称
 * @property int $source_file_id
 * @property string $target_file 目标数据文件地址
 * @property string $file_url 核对结果文件下载地址
 * @property int $file_download_count 核对结果文件下载次数
 * @property int $task_state 任务状态 1=待核对 2=核对中 3=核对完成 4=核对失败
 * @property string|null $task_remark 任务备注
 * @property int $created_at 创建时间
 * @property int $updated_at 更新时间
 * @property int $deleted_at 软删除时间
 * @property int $creator_id 创建人uid
 * @property int $updated_uid 更新人uid
 * @property int $deleted_uid 删除人uid
 */
class DcTask extends Model
{
    use DataRange;
    /** 表名 */
    protected $table = 'dc_task';

    /** 允许填充字段 */
    protected $fillable = [
        'id',
        'task_id',
        'task_name',
        'source_file_id',
        'target_file',
        'file_download_url',
        'file_download_count',
        'task_state',
        'task_remark',
        'created_at',
        'updated_at',
        'deleted_at',
        'creator_id',
        'updated_uid',
        'deleted_uid',
    ];

    /** casts */
    protected $casts = [
        'target_file' => UnescapedJsonCast::class,
        // 'task_state' => TaskStateEnum::class
    ];

      /**
     * 追加到模型数组表单的访问器
     */
    protected $appends = ['task_state_name'];

    /** 列表显示字段 */
    protected array $fields = [
        'id',
        'task_id',
        'task_name',
        'target_file',
        'task_state',
        'created_at',
        'source_file_id',
        'file_download_count'
    ];

    /** 表单填充字段 */
    protected array $form = [
        'task_id',
        'task_name',
        'source_file_id',
        'target_file',
        'file_download_url',
        'file_download_count',
        'task_state',
        'task_remark',
        'creator_id',
        'updated_uid',
        'deleted_uid',
    ];

    /** 搜索字段 */
    public array $searchable = [
        'task_name'  => 'like',
        'task_state' => 'in',
        'creator_id' => '='
    ];

    /**
     * 关联源文件表 - 一个任务属于一个源文件
     */
    public function sourceFile(): BelongsTo
    {
        return $this->belongsTo(DcTaskSourceFile::class, 'source_file_id', 'id');
    }

    /**
     * 获取目标文件名
     */
    protected function targetFileName(): Attribute
    {
        return Attribute::make(
            get: function () {
                $targetFile = json_decode($this->target_file, true);
                return $targetFile['file_name'] ?? '';
            }
        );
    }

     /**
     * 获取文件状态名称
     */
    public function getTaskStateNameAttribute(): string
    {
        try {
            $enum = TaskStateEnum::from($this->task_state);
            return $enum->message();
        } catch (\ValueError $e) {
            return '未知状态';
        }
    }

    /**
     * 关联下载日志表 - 一个任务可以有多个下载日志
     */
    public function downloadLogs(): HasMany
    {
        return $this->hasMany(DcTaskTargetDownloadLog::class, 'task_id', 'task_id');
    }
}
